昨天停留在一段程式碼的解讀:
using UnityEngine;
public class NodeDetection : MonoBehaviour
{
public float raycastDistance = 1.0f;
void Update()
{
// Cast a ray downward from the object's position
RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, raycastDistance);
if (hit.collider != null)
{
// Check if the collider belongs to a node
if (hit.collider.CompareTag("Node"))
{
// Object is above a node, update its position here
float newY = hit.collider.transform.position.y + 1.0f; // Set to node's Y position + offset
transform.position = new Vector3(transform.position.x, newY, transform.position.z);
}
}
}
}
但是我們馬上就遇到了看不懂的地方。
RayCastDistance是做什麼的?
Ray其實就是一種資料結構,代表著Origin起始點和Direction目的地。
舉例來說,可以使用一些韓式達成不同的用法:
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if(physics.Raycast(cameraRay, out RaycastHit hitObject))
{
objectLabel.text = hitObject.collider.gameObject.name;
}
這邊先定義一種Ray叫做cameraRay,是從Main Camera中往目標位置射出的Ray。目標位置是滑鼠位置。
然後判斷式中使用Physics函式中的Raycast。
官方文件內寫了多種關於該函式的用法,這裡是使用最後一種。
該Raycast()可以傳入五種參數:
而這邊使用了兩個:Ray是前面宣告的cameraRay,還有那個out RaycastHit hitObject。
相關的參數解釋,可以看這個:
而在ChatGPT提供的程式碼內:
RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, raycastDistance);
比較像是這種定義:
是由物件往下方射出,與一般的從鏡頭射出的用法不太一樣。
而為什麼要這樣使用呢?
因為該物件將會是玩家方塊。
所以後續程式碼檢測,若Ray的碰撞不為Null空,則:
建立新的Vector3來設定物件位置。
這些是因為,玩家方塊將會檢測底下是否為Node,
並決定是否能夠前往。
然而該程式碼的邏輯有些奇特。
若是已經往下發射Ray並且不為空,則不就在Node上方了嗎?
其實本該是「玩家僅能在節點上」,但是誤會成「為加緊能在節點上方」。
也就是"on"和"above"的誤會了。
但是沒關係,我們還是學會了Ray, Raycast的機制,
並且往後能夠活用之,
這才是本次鐵人賽我所期待的長進。
明天是最後一天了,請期待最後的主題。